package com.tedu.api.ee;

import org.junit.Test;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;

/**
 * 流--传输数据---传输数据过程绝对不能出错【处理手段】
 * 标准流结合异常---标准IO
 *
 * 异常
 * Java面向对象语言，程序中出现的所有错误，定义为对象【处理对应错误】
 *
 * Throwable顶级异常超类
 *
 * Exception异常：描述程序级别的错误---有解决方案
 *               编译期：RunTimeException异常表示类
 *                     FileOutputStream---波浪线---抛出方法之外
 *               检查异常：通常都是编译器检查处理，程序直接报错，抛出
 *               解决方案：①捕获异常（*）
 *                       ②抛出异常---抛出方法之外---打印控制台
 *               运行期：控制台直接显示异常对象【异常对象名字，产生原因】
 *               非检查异常：控制台输出异常对象名称，RunTimeException异常表示
 *               最后了解【throw与throws---RunTimeException】
 *
 * Errow错误：描述系统级别的错误--出现--程序宕机
 *           非常低-->递归问题-->
 */
public class EE {
    /**
     * Error  错误---程序严重错误
     * 模拟：方法调方法---栈溢出错误
     * StackOverflowError栈溢出错误
     * ------程序宕机----后台：9亿账号
     * while(true){
     *     拼接字符串对象
     * }
     */
    public static void method(){
        method();
    }
    @Test
    public void testError(){
        EE.method();
    }
    /**
     * Exception异常：检查异常【出现编译期】---代码报波浪线
     *               两种处理手段：①捕获异常
     *                           语法：try{
     *                               怀疑代码可能有异常或者提示异常
     *                           }catch(小异常名字 e){
     *                               e.printStacktrace(); 打印异常信息
     *                           }catch(中异常名字 e){
     *                               e.printStacktrace(); 打印异常信息
     *                           }catch(大异常名字 e){   Exception
     *
     *                           }finally{
     *                               一定执行代码块
     *                           }
     *                          ②抛出异常
     *             非检查异常【出现运行期】---代码无错误---控制台
     *             ---------------------
     *异常：FileNotFoundException    文件不存在异常
     * 产生原因：路径写错、文件名写错
     * 异常:NullPointerException     空指针异常
     * 产生原因:获取字符串为空，数组:值为空，集合:元素为空【存在null值)大
     * 异常:StringIndex0ut0fBoundsException   字符串下标越界异常
     * 产生原因：字符串下标没有对应的字符
     * NumberFormatException 数字转换异常
     * 产生原因：字符串不是正确的类型
     */
    @Test
    public void testException() throws FileNotFoundException {
        //检查异常【出现编译器】---代码报波浪线
      //  FileOutputStream fis=new FileOutputStream("");
        //非检查异常【出现运行期】---控制台

        try {
            String str="a";
            str.length();
            str.charAt(1);
            Integer.parseInt(str);
        } catch (StringIndexOutOfBoundsException e) {
            e.printStackTrace(); //打印异常对象信息
            System.out.println("字符串小异常：下标越界异常~~");
        }catch(NumberFormatException e){
            e.printStackTrace();//打印异常信息
            System.out.println("字符串小异常");
        }catch(Exception e){
            e.printStackTrace();
            System.out.println("大异常");
        }
         finally {
            System.out.println("一定执行代码块~");
        }
    }
    /**
     *   作业1:写出5个【非检查】异常的代码示例
     *  提示:查API --- java.Lang.异常
     *     字符串、包装类、集合、I0流
     */

    @Test
    public void testHomeWork1(){


//ArrayIndexOutOfBoundsException
// 数组索引越界。
        int[] arr = new int[5];
        System.out.println(arr[10]);

//提示: java.lang.ArithmeticException
//原因: 当进行除法运算时，分母为零，会抛出这个异常。
        int a = 10;
        int b = 0;
        System.out.println(a / b);

// NumberFormatException:
//原因: 字符串转换为数字时格式不正确。。
        String str = "abc";
        int num = Integer.parseInt(str);

//java.lang.ClassCastException
// 不同类
        Object obj = new Integer(10);
       // String str = (String) obj;

        //NullPointerException:
        // 访问空对象的成员变量或方法。
        String str1 = null;
        System.out.println(str.length());
    }
}




